﻿package hanoi {
	/**
	 * El historial de movidas.
	 */
	public final class History {
		/**
		 * Primera movida en el historial.
		 */
		private var _first:Move;
		/**
		 * Última movida en el historial.
		 */
		private var _last:Move;
		
		/**
		 * Constructor.
		 * @param game A que juego corresponde este historial.
		 */
		public function History() {
			_first = null;
			_last = null;
		}
		
		/**
		 * Primera movida en el historial.
		 */
		public function get first():Move {
			return _first;
		}
		
		/**
		 * Graba el historial de movidas de un juego.
		 * @param game El juego a grabar.
		 */
		public function recordGame(game:Hanoi):void {
			game.addEventListener(HanoiEvent.DISC_MOVED, discMoved);
		}
		
		/**
		 * Listener del evento de movida de un disco
		 * @param event El evento ocurrido.
		 */
		private function discMoved(event:HanoiEvent):void {
			var move:Move = Move.forMoveEvent(event);
			if (_last != null) {
				_last.link(move);
				_last = move;
			} else {
				_first = move;
				_last = move;
			}
		}
		
		/**
		 * Representación textual del objeto.
		 */
		public function toString():String {
			var str:String = "{History";
			var move:Move = first;
			while (move != null) {
				str += " " + move;
				move = move.next;
			}
			str += "}";
			return str;
		}
	}
}
